/**
 * 计算字符的长度
 * @author laoguo
 * @param {String} str 字符 
 */
const strLen = str => {
	if (!str) return 0;
	//返回字符串中全角字符的数组，然后用length计算出数目，如果没有匹配的则返回null，这个时候就使用空字符""，然后再加上字符串的length就是区分中英文的字符串的长度了
	var len = str.match(/[^\x00-\xff]/g); //匹配Ascii码大于255字符
	return str.length + (len ? len.length : 0)

}

/**
 * 去掉字符串左右空格
 * @param {String} str 字符  
 */
const strTrimLOrR = str => {
	if (!str) return '';
	return str.replace(/(^\s*)|(\s*$)/g, "")
}

/**
 * 去除字符串所有空格
 * @param {String}   str 字符串
 */
const strAllTrim = str => {
	if (!str) return '';
	return str.replace(/\s|\xA0/g, "")
}

/**
 * 全局替换某个字符为另一个字符
 * @param {String} str 字符
 * @param {String} valueOne 包含的字符
 * @param {String} valueTwo 要替换的字符,选填
 */
const strReplace = (str, valueOne, valueTwo) => {
	if (!str) return '';
	return str.replace(new RegExp(valueOne, 'g'), valueTwo)
}

/**
* 仅显示银行卡号后四位,其他*代替
* @param {String} str 银行卡号  
*/
const strHideBankNo = str => {
	if (!str) return '';
	return str.replace(/\s/g, '').replace(/(\d{4})\d+(\d{4})$/, "**** **** **** $2")
}

/**
 * 文本换行
 * @param {String} str 
 */
const strfeed = str => {
	if (!str) return '';
	return str.replace(/↵/g,"<br/>");
}


/**
 * 手机号中间*代替,其他显示
 * @param {String} str 手机号
 */
const strHidePhone = str => {
	if (!str) return '';
	return str.replace(/^(\d{3})\d{4}(\d+)/,"$1****$2")
}

/**
 * 字符每4位数一个间隔
 * @param {String} str 字符串  
 */
const strFourSeparate = str => {
	if (!str) return '';
	return str.replace(/\s/g, '').replace(/[^\d]/g, '').replace(/(\d{4})(?=\d)/g, '$1 ');
}

/**
 * 判断是否正整数
 * @param {number}
 */
const strIsNum = val => {
	if(val=="")return false;
	var re=/^[1-9]\d*$/;
	return re.test(val);
}

/**
 * 判断是否正整数
 * @param num{number}
 * @param n  {number}
 */
const getFloat = (num, n)=> {
    n = n ? parseInt(n) : 0;
    if(n <= 0) {
        return Math.round(num);
    }
    num = Math.round(num * Math.pow(10, n)) / Math.pow(10, n); //四舍五入
    num = Number(num).toFixed(n); //补足位数
    return num;
};

/* 验证是否正确输入车牌号*/
const VerifyLicePlate = (carnum)=> {
	// let regStr = /^(([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-Z](([0-9]{5}[DF])|([DF]([A-HJ-NP-Z0-9])[0-9]{4})))|([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-Z][A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9挂学警港澳使领]))$/
	// return !regStr.test(carnum) ? false : true
	return carnum.length < 7 ? false : true
};

/**
* 加法
* @param {Number} arg1   
* @param {Number} arg2   
*/ 
const floatAdd = (arg1 = 0,arg2 = 0) => {
	var r1, r2, m, c;
	try {
			r1 = arg1.toString().split(".")[1].length;
	}
	catch (e) {
			r1 = 0;
	}
	try {
			r2 = arg2.toString().split(".")[1].length;
	}
	catch (e) {
			r2 = 0;
	}
	c = Math.abs(r1 - r2);
	m = Math.pow(10, Math.max(r1, r2));
	if (c > 0) {
			var cm = Math.pow(10, c);
			if (r1 > r2) {
					arg1 = Number(arg1.toString().replace(".", ""));
					arg2 = Number(arg2.toString().replace(".", "")) * cm;
			} else {
					arg1 = Number(arg1.toString().replace(".", "")) * cm;
					arg2 = Number(arg2.toString().replace(".", ""));
			}
	} else {
			arg1 = Number(arg1.toString().replace(".", ""));
			arg2 = Number(arg2.toString().replace(".", ""));
	}
	let result = (Number(arg1) + Number(arg2)) / m
	return result
}

/**
* 减法
* @param {Number} num1   
* @param {Number} num2   
*/ 
const floatSub = (num1, num2) => { 
	let exp_1, exp_2,nums;
	try {
		exp_1 = num1.toString().split('.')[1].length
	} catch {
		exp_1 = 0;
	}
	try {
		exp_2 = num2.toString().split('.')[1].length
	} catch {
		exp_2 = 0;
	}
	nums = Math.max(exp_1, exp_2);
	return (num1*Math.pow(10,nums)- num2*Math.pow(10,nums))/Math.pow(10,nums)
} 

/**
 * 移除null值
 * @param {*} list obj or list
 */ 
const removeNull = (list) => {
  if (list instanceof Array) {
    var nlist = []
    for (var i in list) {
      if (list[i] !== null && list[i] !== undefined && list[i] !== 'null' && list[i] !== 'undefined') {
        nlist.push(list[i])
      }
    }
    return nlist
  } else {
    for (var i in list) {
      if (list[i] === null || list[i] === undefined || list[i] === 'null' || list[i] === 'undefined') {
        delete list[i]
      }
    }
    return list
  }
}

/**
 * 判断是否微信浏览器
 */ 
const isWeiXinLogin = () => {
    var ua = window.navigator.userAgent.toLowerCase();
    if (ua.match(/MicroMessenger/i) == 'micromessenger') {
        return true; // 微信中打开
    } else {
        return false; // 普通浏览器中打开
    }
}
// 获取URL参数
const getQueryString = (name) =>{ 
  var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i"); 
  var r = window.location.search.substr(1).match(reg); 
  if (r != null) return decodeURIComponent(r[2]); 
  return null; 
} 

// 获取url上所有参数
const getUrlParams = (url) => {
    // 通过 ? 分割获取后面的参数字符串
    let urlStr = url.split('?')[1] || ''
    // 创建空对象存储参数
	let obj = {};
    // 再通过 & 将每一个参数单独分割出来
	let paramsArr = (urlStr || '').split('&') || []
	for(let i = 0,len = paramsArr.length;i < len;i++){
        // 再通过 = 将每一个参数分割为 key:value 的形式
		let arr = (paramsArr[i] || '').split('=')
		obj[arr[0]] = arr[1];
	}
	return obj
}

// 页面初始化
const initFunc = async (that,that1,options) => {
  const pages = getCurrentPages()
  // 声明一个pages使用getCurrentPages方法
  const curPage = pages[pages.length - 1]
	console.log('curPage',curPage)
	that1.fetchSomething(options || curPage.options)
	// curPage.onShow()
	// await curPage.onLoad(curPage.options) // 传入参数
	// setTimeout(()=>{
		// curPage.onReady()
	// },1000)
}
// 获取嵌套实例
const _ref = (refs,tier) => {
	let ref = {}
	// #ifndef MP-ALIPAY
	tier = Array.isArray(tier) ? tier : tier.split(',')
	ref = refs[tier[tier.length - 1]]
	// #endif
	
	// #ifdef MP-ALIPAY 
	if(Array.isArray(tier)){
		ref = tier.reduce((prev, curr) => {
			prev = prev.$refs || prev
			return prev[curr] || false
		}, refs)
	}else{
		ref = _reffind(refs, tier) 
	}
	
	function _reffind(refs, tier){
		if(refs[tier]){return refs[tier]}
		const arr = Object.values(refs)
		for (let i = 0; i < arr.length; i++) {
			let val = _reffind(arr[i].$refs,tier)
			if(val) return val
		}
		return false
	}
	if(!ref){
		throw new Error('ref组件未找到', JSON.stringify(tier))
	}
	// #endif
	
	return ref
}

/**
 * 获取当前页面|页面栈中的对象
 * @param {Number} index 
 * @returns {Object} 页面指针对象
 */
const getNowPage = (index = 0) => {
  var pages = getCurrentPages()
  if (!pages) { return null }
  var npage = pages[pages.length - 1 + index]
  return npage
}

export {
	strLen,
	strTrimLOrR,
	strReplace,
	strAllTrim,
	strHideBankNo,
	strFourSeparate,
	strHidePhone,
	strfeed,
	strIsNum,
	getFloat,
	VerifyLicePlate,
	floatAdd,
	floatSub,
	removeNull,
	isWeiXinLogin,
	getQueryString,
	getUrlParams,
	initFunc,
	_ref,
	getNowPage,
}
